package digitrencer;



/**
 * A kimeneti elemek gyűjtőosztálya. Minden kimeneti alkatrészt megvalósító
 * osztályt ebből az osztályból származtatunk, valamint itt valósítjuk meg
 * ezeknek a közös fukcióit.
 * @author taplonaplo
 */
public abstract class Output extends Element {
        /**
         * Ez az érték reprezentálja a kimenet(ek) éppen aktuális értékét.
         */
	protected boolean[] value;


        /**
         * Output osztály konstruktora. Meghívja az Element konstruktorát, majd
         * ellenőrzi, hogy kapott-e kimeneti vezetékeket. Amennyiben igen, hibát
         * dob, mivel az Output osztály tagjainak nem lehetnek ilyen vezetékei,
         * mert kimeneti alkatrészek.
         * @param inputs    Bemeneti vezetékek
         * @param outputs   Kimeneti vezetékek
         * @throws IllegalArgumentException Amennyiben megadtunk kimeneti vezetéket.
         */
        Output(Wire[] inputs, Wire[] outputs) throws IllegalArgumentException{ //Gergő
            super(inputs,outputs);
            if (outputs.length > 0)
                throw new IllegalArgumentException("An output object may not have output wires.");
            value = new boolean[inputs.length];
        }

        /**
         * Output osztály futási metódusa. A kimenet értékeit beállítja a hozzá
         * csatlakozó vezetékek végén lévő értékre.
         */
        @Override
        public void run() {
            for (int i = 0; i < in.length; i++)
                value[i] = in[i].getEnd();
        }
        
        /**
         * Metódus az Output value attribútumának lekérdezésére. Létrehoz egy
         * másolatot a kimenet jelenlegi értékeiről és ezt visszaadja.
         * @return A kimenet jelenlegi értékei.
         */
	public boolean[] getValue() {
            boolean[] val = new boolean[value.length];
            System.arraycopy(value, 0, val, 0, value.length);
            return val;
	}
}